Senden einer Mail aus Python SMTP
Frage
Ich verwende die folgende Methode Mail von Python senden SMTP. Ist es die richtige Methode zu verwenden, oder gibt es Fallstricke, ich bin fehlt?
from smtplib import SMTP
import datetime
debuglevel = 0
smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
from_addr = "John Doe <john@doe.net>"
to_addr = "foo@bar.com"
subj = "hello"
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )
message_text = "Hello\nThis is a mail from your server\n\nBye\n"
msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s"
% ( from_addr, to_addr, subj, date, message_text )
smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
Lösung
Das Skript Ich benutze ist ganz ähnlich; Ich poste es hier als ein Beispiel dafür, wie die E-Mail verwenden * Module MIME-Nachrichten zu generieren. so kann dieses Skript einfach Bilder modifiziert werden zu befestigen, etc.
ich auf meinem ISP angewiesen, um das Datum Zeit Header hinzuzufügen.
Ihr ISP erfordert mich eine sichere SMTP-Verbindung zu verwenden, um Mail zu schicken, verlasse ich mich auf dem smtplib Modul (herunterladbar unter http://www1.cs.columbia.edu/~db2501/ssmtplib.py )
Wie in Ihrem Skript, der Benutzername und das Passwort, (Dummy-Wert weiter unten), verwendete auf dem SMTP-Server zu authentifizieren, ist im Klartext in der Quelle. Dies ist eine Sicherheitsschwäche; aber die beste Alternative hängt davon ab, wie vorsichtig man braucht (will?) zu schützen diese zu sein.
=======================================
#! /usr/local/bin/python
SMTPserver = 'smtp.att.yahoo.com'
sender = 'me@my_email_domain.net'
destination = ['recipient@her_email_domain.com']
USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"
# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'
content="""\
Test message
"""
subject="Sent from Python"
import sys
import os
import re
from smtplib import SMTP_SSL as SMTP # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP # use this for standard SMTP protocol (port 25, no encryption)
# old version
# from email.MIMEText import MIMEText
from email.mime.text import MIMEText
try:
msg = MIMEText(content, text_subtype)
msg['Subject']= subject
msg['From'] = sender # some SMTP servers will do this automatically, not all
conn = SMTP(SMTPserver)
conn.set_debuglevel(False)
conn.login(USERNAME, PASSWORD)
try:
conn.sendmail(sender, destination, msg.as_string())
finally:
conn.quit()
except:
sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message
Andere Tipps
Die Methode, die ich häufig verwenden ... nicht viel anders, aber ein wenig
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
msg = MIMEMultipart()
msg['From'] = 'me@gmail.com'
msg['To'] = 'you@gmail.com'
msg['Subject'] = 'simple email in python'
message = 'here is the email'
msg.attach(MIMEText(message))
mailserver = smtplib.SMTP('smtp.gmail.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login('me@gmail.com', 'mypassword')
mailserver.sendmail('me@gmail.com','you@gmail.com',msg.as_string())
mailserver.quit()
Das ist es
Auch wenn Sie die SMTP-Authentifizierung mit TLS tun wollen im Gegensatz zu SSL dann müssen Sie nur noch den Port ändern (verwenden 587) und tun smtp.starttls (). Dieser arbeitete für mich:
...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
...
Der Haupt Gotcha ich sehe, ist, dass Sie keine Fehler Handhabung: .login () und .sendmail () haben beide Ausnahmen dokumentiert, dass sie werfen können, und es scheint, wie .Connect () muss eine Möglichkeit haben, um anzuzeigen, zu verbinden, dass es nicht in der Lage -. vermutlich durch den zugrunde liegenden Socket Code ausgelöst eine Ausnahme
Stellen Sie sicher, Sie haben keinen Firewalls blockiert SMTP. Das erste Mal habe ich versucht, eine E-Mail zu schicken, es wurde sowohl durch die Windows-Firewall und McAfee blockiert -. Dauerte ewig, sie beide zu finden
Was ist das?
import smtplib
SERVER = "localhost"
FROM = "sender@example.com"
TO = ["user@example.com"] # must be a list
SUBJECT = "Hello!"
TEXT = "This message was sent with Python's smtplib."
# Prepare actual message
message = """\
From: %s
To: %s
Subject: %s
%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
# Send the mail
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()
folgender Code funktioniert gut für mich:
import smtplib
to = 'mkyong2002@yahoo.com'
gmail_user = 'mkyong2002@gmail.com'
gmail_pwd = 'yourpassword'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo() # extra characters to permit edit
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n'
print header
msg = header + '\n this is test msg from mkyong.com \n\n'
smtpserver.sendmail(gmail_user, to, msg)
print 'done!'
smtpserver.quit()
Ref: http: // www .mkyong.com / python / wie-do-send-E-Mail-in-python-via-smtplib /
Sie sollten Sie das Datum im richtigen Format formatiert werden sicher - RFC2822 .
Alle diese lenghty Antworten? Gestatten Sie mir selbst zu fördern, indem sie alle in ein paar Zeilen zu tun.
Import und Verbindung:
import yagmail
yag = yagmail.SMTP('john@doe.net', host = 'YOUR.MAIL.SERVER', port = 26)
Dann ist es nur ein Einzeiler:
yag.send('foo@bar.com', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')
Es wird tatsächlich zu schließen, wenn es den Bereich verlässt (oder kann manuell geschlossen). Darüber hinaus ermöglicht es Ihnen Ihre Benutzername in Ihrem Schlüsselbund zu registrieren, so dass Sie müssen Ihr Passwort in Ihrem Skript nicht schreiben (es wirklich störte mich vor dem Schreiben yagmail
!)
Für die Verpackung / Montage, Tipps und Tricks finden Sie in git oder pip , verfügbar sowohl für Python 2 und 3
Der Beispielcode, die ich für Sende Mail tat SMTP.
import smtplib, ssl
smtp_server = "smtp.gmail.com"
port = 587 # For starttls
sender_email = "sender@email"
receiver_email = "receiver@email"
password = "<your password here>"
message = """ Subject: Hi there
This message is sent from Python."""
# Create a secure SSL context
context = ssl.create_default_context()
# Try to log in to server and send email
server = smtplib.SMTP(smtp_server,port)
try:
server.ehlo() # Can be omitted
server.starttls(context=context) # Secure the connection
server.ehlo() # Can be omitted
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message)
except Exception as e:
# Print any error messages to stdout
print(e)
finally:
server.quit()
Sie können wie das tun
import smtplib
from email.mime.text import MIMEText
from email.header import Header
server = smtplib.SMTP('mail.servername.com', 25)
server.ehlo()
server.starttls()
server.login('username', 'password')
from = 'me@servername.com'
to = 'mygfriend@servername.com'
body = 'That A Message For My Girl Friend For tell Him If We will go to eat Something This Nigth'
subject = 'Invite to A Diner'
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
message = msg.as_string()
server.sendmail(from, to, message)
Hier ist ein funktionierendes Beispiel für Python 3.x
#!/usr/bin/env python3
from email.message import EmailMessage
from getpass import getpass
from smtplib import SMTP_SSL
from sys import exit
smtp_server = 'smtp.gmail.com'
username = 'your_email_address@gmail.com'
password = getpass('Enter Gmail password: ')
sender = 'your_email_address@gmail.com'
destination = 'recipient_email_address@gmail.com'
subject = 'Sent from Python 3.x'
content = 'Hello! This was sent to you via Python 3.x!'
# Create a text/plain message
msg = EmailMessage()
msg.set_content(content)
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = destination
try:
s = SMTP_SSL(smtp_server)
s.login(username, password)
try:
s.send_message(msg)
finally:
s.quit()
except Exception as E:
exit('Mail failed: {}'.format(str(E)))